/*!
 * \file SelStraContext.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief SEL策略上下文实现文件
 * 
 * 本文件实现了SEL(Selection)策略上下文类的核心功能，作为SEL策略与引擎之间的桥梁。
 * 负责处理引擎的各种选股相关事件回调，并将这些事件转发给具体的SEL策略实例。
 * 包括策略初始化、交易时段管理、K线数据处理、Tick数据更新和策略定时调度等功能。
 */
#include "SelStraContext.h"
#include "../Includes/SelStrategyDefs.h"

/**
 * @brief 构造函数
 * 
 * 创建SEL策略上下文实例，初始化基础上下文和策略指针
 * 
 * @param engine SEL引擎指针
 * @param name 策略名称
 */
SelStraContext::SelStraContext(WtSelEngine* engine, const char* name)
	: SelStraBaseCtx(engine, name)
	, _strategy(NULL)
{
}

/**
 * @brief 析构函数
 * 
 * 清理资源
 */
SelStraContext::~SelStraContext()
{
}

/**
 * @brief 策略初始化回调实现
 * 
 * 当策略需要初始化时被调用，先调用基类初始化，再转发给具体的策略实例
 */
void SelStraContext::on_init()
{
	SelStraBaseCtx::on_init();

	if (_strategy)
		_strategy->on_init(this);
}

/**
 * @brief 交易时段开始回调实现
 * 
 * 当交易时段开始时被调用，先调用基类处理，再转发给具体的策略实例
 * 
 * @param uTDate 交易日期（格式：YYYYMMDD）
 */
void SelStraContext::on_session_begin(uint32_t uTDate)
{
	SelStraBaseCtx::on_session_begin(uTDate);

	if (_strategy)
		_strategy->on_session_begin(this, uTDate);
}

/**
 * @brief 交易时段结束回调实现
 * 
 * 当交易时段结束时被调用，先转发给具体的策略实例，再调用基类处理
 * 
 * @param uTDate 交易日期（格式：YYYYMMDD）
 */
void SelStraContext::on_session_end(uint32_t uTDate)
{
	if (_strategy)
		_strategy->on_session_end(this, uTDate);

	SelStraBaseCtx::on_session_end(uTDate);
}

/**
 * @brief K线闭合回调实现
 * 
 * 当有K线闭合时被调用，转发给具体的策略实例进行处理
 * 
 * @param stdCode 标准合约代码
 * @param period K线周期
 * @param newBar 新的K线数据
 */
void SelStraContext::on_bar_close(const char* stdCode, const char* period, WTSBarStruct* newBar)
{
	if (_strategy)
		_strategy->on_bar(this, stdCode, period, newBar);
}

/**
 * @brief Tick数据更新回调实现
 * 
 * 当有Tick数据更新时被调用，检查是否订阅了该合约的Tick数据，
 * 如果已订阅则转发给具体的策略实例
 * 
 * @param stdCode 标准合约代码
 * @param newTick 新的Tick数据
 */
void SelStraContext::on_tick_updated(const char* stdCode, WTSTickData* newTick)
{
	// 检查是否订阅了该合约的Tick数据
	auto it = _tick_subs.find(stdCode);
	if (it == _tick_subs.end())
		return;

	if (_strategy)
		_strategy->on_tick(this, stdCode, newTick);
}

/**
 * @brief 策略调度回调实现
 * 
 * 当策略需要定时调度时被调用，转发给具体的策略实例
 * 
 * @param curDate 当前日期（格式：YYYYMMDD）
 * @param curTime 当前时间（格式：HHMM）
 */
void SelStraContext::on_strategy_schedule(uint32_t curDate, uint32_t curTime)
{
	if (_strategy)
		_strategy->on_schedule(this, curDate, curTime);
}
